<!DOCTYPE html>
<html>

<head>

<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title>resume_shyee</title>


<style type="text/css">
body {
  font-family: Helvetica, arial, sans-serif;
  font-size: 14px;
  line-height: 1.6;
  padding-top: 10px;
  padding-bottom: 10px;
  background-color: white;
  padding: 30px; }

body > *:first-child {
  margin-top: 0 !important; }
body > *:last-child {
  margin-bottom: 0 !important; }

a {
  color: #4183C4; }
a.absent {
  color: #cc0000; }
a.anchor {
  display: block;
  padding-left: 30px;
  margin-left: -30px;
  cursor: pointer;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0; }

h1, h2, h3, h4, h5, h6 {
  margin: 20px 0 10px;
  padding: 0;
  font-weight: bold;
  -webkit-font-smoothing: antialiased;
  cursor: text;
  position: relative; }

h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor {
  background: url() no-repeat 10px center;
  text-decoration: none; }

h1 tt, h1 code {
  font-size: inherit; }

h2 tt, h2 code {
  font-size: inherit; }

h3 tt, h3 code {
  font-size: inherit; }

h4 tt, h4 code {
  font-size: inherit; }

h5 tt, h5 code {
  font-size: inherit; }

h6 tt, h6 code {
  font-size: inherit; }

h1 {
  font-size: 28px;
  color: black; }

h2 {
  font-size: 24px;
  border-bottom: 1px solid #cccccc;
  color: black; }

h3 {
  font-size: 18px; }

h4 {
  font-size: 16px; }

h5 {
  font-size: 14px; }

h6 {
  color: #777777;
  font-size: 14px; }

p, blockquote, ul, ol, dl, li, table, pre {
  margin: 15px 0; }

hr {
  background: transparent url() repeat-x 0 0;
  border: 0 none;
  color: #cccccc;
  height: 4px;
  padding: 0;
}

body > h2:first-child {
  margin-top: 0;
  padding-top: 0; }
body > h1:first-child {
  margin-top: 0;
  padding-top: 0; }
  body > h1:first-child + h2 {
    margin-top: 0;
    padding-top: 0; }
body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child {
  margin-top: 0;
  padding-top: 0; }

a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
  margin-top: 0;
  padding-top: 0; }

h1 p, h2 p, h3 p, h4 p, h5 p, h6 p {
  margin-top: 0; }

li p.first {
  display: inline-block; }
li {
  margin: 0; }
ul, ol {
  padding-left: 30px; }

ul :first-child, ol :first-child {
  margin-top: 0; }

dl {
  padding: 0; }
  dl dt {
    font-size: 14px;
    font-weight: bold;
    font-style: italic;
    padding: 0;
    margin: 15px 0 5px; }
    dl dt:first-child {
      padding: 0; }
    dl dt > :first-child {
      margin-top: 0; }
    dl dt > :last-child {
      margin-bottom: 0; }
  dl dd {
    margin: 0 0 15px;
    padding: 0 15px; }
    dl dd > :first-child {
      margin-top: 0; }
    dl dd > :last-child {
      margin-bottom: 0; }

blockquote {
  border-left: 4px solid #dddddd;
  padding: 0 15px;
  color: #777777; }
  blockquote > :first-child {
    margin-top: 0; }
  blockquote > :last-child {
    margin-bottom: 0; }

table {
  padding: 0;border-collapse: collapse; }
  table tr {
    border-top: 1px solid #cccccc;
    background-color: white;
    margin: 0;
    padding: 0; }
    table tr:nth-child(2n) {
      background-color: #f8f8f8; }
    table tr th {
      font-weight: bold;
      border: 1px solid #cccccc;
      margin: 0;
      padding: 6px 13px; }
    table tr td {
      border: 1px solid #cccccc;
      margin: 0;
      padding: 6px 13px; }
    table tr th :first-child, table tr td :first-child {
      margin-top: 0; }
    table tr th :last-child, table tr td :last-child {
      margin-bottom: 0; }

img {
  max-width: 100%; }

span.frame {
  display: block;
  overflow: hidden; }
  span.frame > span {
    border: 1px solid #dddddd;
    display: block;
    float: left;
    overflow: hidden;
    margin: 13px 0 0;
    padding: 7px;
    width: auto; }
  span.frame span img {
    display: block;
    float: left; }
  span.frame span span {
    clear: both;
    color: #333333;
    display: block;
    padding: 5px 0 0; }
span.align-center {
  display: block;
  overflow: hidden;
  clear: both; }
  span.align-center > span {
    display: block;
    overflow: hidden;
    margin: 13px auto 0;
    text-align: center; }
  span.align-center span img {
    margin: 0 auto;
    text-align: center; }
span.align-right {
  display: block;
  overflow: hidden;
  clear: both; }
  span.align-right > span {
    display: block;
    overflow: hidden;
    margin: 13px 0 0;
    text-align: right; }
  span.align-right span img {
    margin: 0;
    text-align: right; }
span.float-left {
  display: block;
  margin-right: 13px;
  overflow: hidden;
  float: left; }
  span.float-left span {
    margin: 13px 0 0; }
span.float-right {
  display: block;
  margin-left: 13px;
  overflow: hidden;
  float: right; }
  span.float-right > span {
    display: block;
    overflow: hidden;
    margin: 13px auto 0;
    text-align: right; }

code, tt {
  margin: 0 2px;
  padding: 0 5px;
  white-space: nowrap;
  border: 1px solid #eaeaea;
  background-color: #f8f8f8;
  border-radius: 3px; }

pre code {
  margin: 0;
  padding: 0;
  white-space: pre;
  border: none;
  background: transparent; }

.highlight pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px; }

pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px; }
  pre code, pre tt {
    background-color: transparent;
    border: none; }

sup {
    font-size: 0.83em;
    vertical-align: super;
    line-height: 0;
}

kbd {
  display: inline-block;
  padding: 3px 5px;
  font-size: 11px;
  line-height: 10px;
  color: #555;
  vertical-align: middle;
  background-color: #fcfcfc;
  border: solid 1px #ccc;
  border-bottom-color: #bbb;
  border-radius: 3px;
  box-shadow: inset 0 -1px 0 #bbb
}

* {
	-webkit-print-color-adjust: exact;
}
@media screen and (min-width: 914px) {
    body {
        width: 854px;
        margin:0 auto;
    }
}
@media print {
	table, pre {
		page-break-inside: avoid;
	}
	pre {
		word-wrap: break-word;
	}
}
</style>

<style type="text/css">
/**
 * prism.js default theme for JavaScript, CSS and HTML
 * Based on dabblet (http://dabblet.com)
 * @author Lea Verou
 */

code[class*="language-"],
pre[class*="language-"] {
	color: black;
	background: none;
	text-shadow: 0 1px white;
	font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
	text-align: left;
	white-space: pre;
	word-spacing: normal;
	word-break: normal;
	word-wrap: normal;
	line-height: 1.5;

	-moz-tab-size: 4;
	-o-tab-size: 4;
	tab-size: 4;

	-webkit-hyphens: none;
	-moz-hyphens: none;
	-ms-hyphens: none;
	hyphens: none;
}

pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
	text-shadow: none;
	background: #b3d4fc;
}

pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
code[class*="language-"]::selection, code[class*="language-"] ::selection {
	text-shadow: none;
	background: #b3d4fc;
}

@media print {
	code[class*="language-"],
	pre[class*="language-"] {
		text-shadow: none;
	}
}

/* Code blocks */
pre[class*="language-"] {
	padding: 1em;
	margin: .5em 0;
	overflow: auto;
}

:not(pre) > code[class*="language-"],
pre[class*="language-"] {
	background: #f5f2f0;
}

/* Inline code */
:not(pre) > code[class*="language-"] {
	padding: .1em;
	border-radius: .3em;
	white-space: normal;
}

.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
	color: slategray;
}

.token.punctuation {
	color: #999;
}

.namespace {
	opacity: .7;
}

.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
	color: #905;
}

.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
	color: #690;
}

.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
	color: #a67f59;
	background: hsla(0, 0%, 100%, .5);
}

.token.atrule,
.token.attr-value,
.token.keyword {
	color: #07a;
}

.token.function {
	color: #DD4A68;
}

.token.regex,
.token.important,
.token.variable {
	color: #e90;
}

.token.important,
.token.bold {
	font-weight: bold;
}
.token.italic {
	font-style: italic;
}

.token.entity {
	cursor: help;
}
</style>


</head>

<body>

<h1 id="toc_0">李坪的个人简历</h1>

<blockquote>
<p>改变始于行动，成功来自坚持。
<img width="128" height="128" border="1" style="vertical-align:middle;margin-left:160px;" src="https://leuzeworld.gitee.io/myresume/face.jpg"/></p>
</blockquote>

<h1 id="toc_1">联系方式</h1>

<ul>
<li>手机：13670002511</li>
<li>Email：<a href="mailto:76030844@qq.com?subject=Hello,Donen.&amp;body=Hello,Donen:%0d%0a">76030844@qq.com</a></li>
<li>微信号：liping19870819<br>
<img src="https://leuzeworld.gitee.io/myresume/weixin_mini.png" alt="二维码"></li>
<li>网页简历：<a href="https://leuzeworld.gitee.io/myresume">https://leuzeworld.gitee.io/myresume/</a><br></li>
<li>简历密码：liping</li>
</ul>

<hr>

<h1 id="toc_2">个人信息</h1>

<ul>
<li>Donen/男/1987</li>
<li>籍 贯：湖南衡阳</li>
<li>本科/2011届湖南工学院计算机系</li>
<li>英语能力：CET6</li>
<li>工作年限：8年</li>
<li>技术博客：<a href="http://www.cocoa520.com">http://www.cocoa520.com</a></li>
<li>Github: <a href="http://github.com/cocoa520">http://github.com/cocoa520</a></li>
<li>兴趣爱好：阅读、篮球、骑行等</li>
<li>个人性格：温和、开朗、责任心强、坚强</li>
<li>目前职位：部门经理、Mac高级开发工程师、篮协会长</li>
<li>期望职位：Mac/iOS开发工程师</li>
<li>期望薪资：面议</li>
</ul>

<hr>

<h1 id="toc_3">工作经历</h1>

<h2 id="toc_4">深圳麦风科技股份有限公司（2018年5月 ~ 至今）</h2>

<h3 id="toc_5">AnyRecover项目</h3>

<p>产品简介：一款支持Windows及Mac平台从FAT12/FAT16/FAT32/ExFat/NTFS/HFS+/APFS文件系统中恢复设备删除或者丢失数据的磁盘工具软件。<br>
产品网址：<a href="https://www.anyrecover.com/">https://www.anyrecover.com/</a></p>

<p>负责的工作有：</p>

<ul>
<li>底层接口设计、框架设计以及项目管理</li>
<li>磁盘监听、设备IO读写、分区解析以及扫描</li>
<li>Raw扫描以及高位簇等方案分析</li>
<li>HFS+文件系统扫描方案分析</li>
<li>虚拟磁盘VHD、VHDX解析与扫描</li>
<li>虚拟机VDI、HDD、VMDK镜像文件的解析与扫描</li>
<li>APFS加密与非加密文件系统的扫描与恢复</li>
</ul>

<p>个人的价值有：</p>

<ul>
<li>项目底层的设计以及管理，保证项目正常进行</li>
<li>多次进行项目成员的数据恢复业务知识的培训</li>
<li>针对磁盘数据的易失性，提出虚拟磁盘VHD、VHDX的测试方法</li>
<li>为保证测试数据的复用，处理虚拟磁盘VHD、VHDX在Mac上的挂载问题</li>
<li>解决VHD、VHDX、VDI、HDD、VMDK磁盘文件的动态格式解析</li>
<li>针对不同文件系统的扫描效率提出不同对应方案</li>
</ul>

<h3 id="toc_6">iCloud项目</h3>

<p>主要功能：iCloud双重与非双重认证帐号的登陆，备份及快照信息枚举，Keybag密钥获取，文件Chunk下载，文件组合解密。<br></p>

<p>负责的工作有：</p>

<ul>
<li>iOS11以及iOS12版本iCloud更改后备份AssetToken的获取，备份文件的下载。</li>
<li>后期整个项目的维护与优化。</li>
</ul>

<h2 id="toc_7">万兴科技股份有限公司（2011年6月 ~ 2018年5月）</h2>

<h3 id="toc_8">TunesGo Mac项目</h3>

<p>产品简介：一款集iOS、Android、iPod设备双向传输，音视频下载录音刻录ID3修复以及iTunes库管理的Mac平台的商业音乐软件。<br>
产品网址：<a href="http://www.wondershare.com/tunesgo/">http://www.wondershare.com/tunesgo/</a></p>

<p>负责的工作有：</p>

<ul>
<li>Android设备与守护通信</li>
<li>iOS设备媒体管理</li>
<li>iPod设备媒体管理</li>
<li>ID3信息的编辑</li>
<li>音乐播放器的实现</li>
<li>音视频Discover、iTunes库备份还原界面、ToolBox等UI实现</li>
<li>界面框架设计、产品包优化缩减等</li>
</ul>

<p>个人的价值有：</p>

<ul>
<li>从0开始参与项目的规划、构建、设计与开发</li>
<li>熟悉iOS设备媒体相关的AirTraffic、AFC、MobileDevice、CDB等协议</li>
<li>熟悉iPod智能与非智能设备的媒体数据库的操作</li>
<li>封装了可复用的OC版本的TagLib库</li>
<li>了解项目大部分的细节问题</li>
</ul>

<h3 id="toc_9">MobileTrans Mac项目</h3>

<p>产品简介：一款设备之间一键转移联系人、短信、通话记录、图片、音视频等的Mac平台的商业转机软件。<br>
产品网址：<a href="http://www.wondershare.com/mac-phone-transfer/">http://www.wondershare.com/mac-phone-transfer/</a></p>

<p>项目背景：</p>

<blockquote>
<p>公司Win MobileTrans产品推出近2年时间，效果较好，决定迅速推出Mac平台，但要实现达到与Win同等水平的功能需求，项目周期会很长，项目组内部讨论一直找不到平衡点，当时恰好了解一些Mono相关的知识，而且Win的项目代码基本上由C#编写，所以我提出了把Win产品使用Mono移值到Mac平台的方案，项目周期将立马缩短几倍，但技术风险很大。不过，最后竟然得到了领导的同意，因为风险太大，项目组就一直默默的探索与开发了三个多月，最终有心人天不负，项目按时按量按质顺利发布，并打破了多项公司记录。</p>
</blockquote>

<p>负责的工作有：</p>

<ul>
<li>Mono开发平台以及IDE的了解与熟悉</li>
<li>Win项目各模块移值方案预研</li>
<li>MonoMac Binging界面开发的可行性</li>
<li>商业授权、项目混淆及打包环境的自动构建</li>
<li>iOS管理模块的移植与调试</li>
<li>iTunes CDB及Win COM的移值等</li>
</ul>

<p>个人的体会有：</p>

<p>虽然是一个偏冷门的技术，但能从头到尾了解它应用到实际项目中的每一个技术细节，这是一个挑战也是一个成长。</p>

<h3 id="toc_10">Dr.Fone for iOS Mac项目</h3>

<p>产品简介：世界第一款恢复iOS设备、联系人、短信、图片、Note、语音备忘录等的Mac平台商业设备数据恢复软件。<br>
产品网址：<a href="http://www.wondershare.com/data-recovery-mac/mac-iphone-data-recovery.html">http://www.wondershare.com/data-recovery-mac/mac-iphone-data-recovery.html</a></p>

<p>负责的工作有：</p>

<ul>
<li>iTunes备份文件数据的解析与恢复</li>
<li>iOS设备联系人、短信及Note DB的数据解析与恢复</li>
<li>界面UI重构及设备连接模块</li>
</ul>

<p>个人的收获有：</p>

<ul>
<li>熟悉了C及C++跨平台的开发知识</li>
<li>加深理解OC设计模式的应用</li>
<li>熟悉了SQLite3数据库的结构与操作</li>
</ul>

<h3 id="toc_11">其他项目</h3>

<p>除了上面的项目，还参与了Dr.Fone for Android、Data Recovery、TunesGo Retro等项目，其中学习了Cocoa界面开发、也包括标准C&amp;C++与Linux Shell等一些知识。</p>

<hr>

<h2 id="toc_12">开源项目</h2>

<ul>
<li><a href="https://github.com/cocoa520/LoveString">LoveString</a> : 一个Mac平台字符编码查询器</li>
<li><a href="https://github.com/cocoa520/TaglibEx">TaglibEx</a> : 一个修改Taglib开源库支持iTunesMetaData读与写的C++库。</li>
<li><a href="https://github.com/cocoa520/VideoToGif">VideoToGif</a> : 一个支持10.6系统的Video转换成Gif的工具。</li>
<li><a href="https://github.com/cocoa520/TaglibEx">iReSign</a> : 一个iOS IPA重签名Mac工具。</li>
<li><a href="https://github.com/cocoa520/cocoa520.github.com">Cocoa520</a> : 基于 Jekyll的个人工作，学习，生活交流博客。</li>
</ul>

<h2 id="toc_13">交流分享</h2>

<ul>
<li><a href="http://www.cocoa520.com/images/blogImage/mv_wiki.png">WiKi知识库</a> : 知识交流与技术分享的WiKi系统。</li>
<li>技术分享：<a href="http://www.cocoa520.com/images/blogImage/compile_debug.png">漫谈编译与调试</a></li>
<li>技术分享：<a href="http://www.cocoa520.com/images/blogImage/mono.png">Mono开发入门</a></li>
<li>技术分享：<a href="http://www.cocoa520.com/images/blogImage/cocoa_runprocess.png">Cocoa应用程序运行过程探析</a></li>
<li>技术分享：<a href="http://www.cocoa520.com/images/blogImage/Envprotecting.png">做环保主义程序员</a></li>
<li>技术分享：<a href="http://www.cocoa520.com/images/blogImage/cocoa_32think.png">关于新建cocoa程序改为32位编译错误的思考</a></li>
<li>技术分享：<a href="http://www.cocoa520.com/images/blogImage/libmtp.png">使用libmtp1.19与libusb1.0.20测试Android手机对MTP的支持情况 </a></li>
<li>技术分享：iOS设备管理技术</li>
<li>技术分享：Mac开发大全</li>
<li>技术分享：安全编码指南</li>
</ul>

<h1 id="toc_14">技能清单</h1>

<p>以下均为我了解、熟练或者使用过的技能</p>

<ul>
<li>功能开发：C/C++/Mono/Objc/Python</li>
<li>界面开发：Cocoa/CocoaTouch/QT</li>
<li>系统框架：Accelerate/AudioToolbox/AVFoudation/IOKit/
CoreFoundation/DiskArbitration/MobileDevice/AirTraffic/
Quartz/QTKit/ScriptingBridge/WebKit</li>
<li>数据库相关：SQLite3/MySQL</li>
<li>云服务相关：LeanCloud/FireBase/Bmob</li>
<li>版本管理、文档和自动化部署工具：Svn/Git/WCPDoc/AppleDoc/XcodeBuild/mdtool/Make/QMake/Macdeployqt</li>
<li>第三方平台：FaceBook/Twitter/WeChatPay/AliPay/AMap/Google Measurement/BugSplat</li>
</ul>

<h1 id="toc_15">所获荣誉</h1>

<ul>
<li>2013年度优秀员工</li>
<li>2014年万兴WBA杯篮球赛银牌</li>
<li>2014年度技术牛人奖</li>
<li>2014年度优秀员工</li>
<li>2016季度优秀员工</li>
<li>2017季度优秀员工</li>
<li>2018月度优秀员工</li>
</ul>

<h1 id="toc_16">致谢</h1>

<p>感谢您花时间阅读我的简历，期待能有机会和您共事。</p>



<script type="text/javascript">
var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-(\w+)\b/i,t=0,n=_self.Prism={util:{encode:function(e){return e instanceof a?new a(e.type,n.util.encode(e.content),e.alias):"Array"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).match(/\[object (\w+)\]/)[1]},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function(e){var t=n.util.type(e);switch(t){case"Object":var a={};for(var r in e)e.hasOwnProperty(r)&&(a[r]=n.util.clone(e[r]));return a;case"Array":return e.map&&e.map(function(e){return n.util.clone(e)})}return e}},languages:{extend:function(e,t){var a=n.util.clone(n.languages[e]);for(var r in t)a[r]=t[r];return a},insertBefore:function(e,t,a,r){r=r||n.languages;var l=r[e];if(2==arguments.length){a=arguments[1];for(var i in a)a.hasOwnProperty(i)&&(l[i]=a[i]);return l}var o={};for(var s in l)if(l.hasOwnProperty(s)){if(s==t)for(var i in a)a.hasOwnProperty(i)&&(o[i]=a[i]);o[s]=l[s]}return n.languages.DFS(n.languages,function(t,n){n===r[e]&&t!=e&&(this[t]=o)}),r[e]=o},DFS:function(e,t,a,r){r=r||{};for(var l in e)e.hasOwnProperty(l)&&(t.call(e,l,e[l],a||l),"Object"!==n.util.type(e[l])||r[n.util.objId(e[l])]?"Array"!==n.util.type(e[l])||r[n.util.objId(e[l])]||(r[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,l,r)):(r[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,null,r)))}},plugins:{},highlightAll:function(e,t){var a={callback:t,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};n.hooks.run("before-highlightall",a);for(var r,l=a.elements||document.querySelectorAll(a.selector),i=0;r=l[i++];)n.highlightElement(r,e===!0,a.callback)},highlightElement:function(t,a,r){for(var l,i,o=t;o&&!e.test(o.className);)o=o.parentNode;o&&(l=(o.className.match(e)||[,""])[1],i=n.languages[l]),t.className=t.className.replace(e,"").replace(/\s+/g," ")+" language-"+l,o=t.parentNode,/pre/i.test(o.nodeName)&&(o.className=o.className.replace(e,"").replace(/\s+/g," ")+" language-"+l);var s=t.textContent,u={element:t,language:l,grammar:i,code:s};if(!s||!i)return n.hooks.run("complete",u),void 0;if(n.hooks.run("before-highlight",u),a&&_self.Worker){var c=new Worker(n.filename);c.onmessage=function(e){u.highlightedCode=e.data,n.hooks.run("before-insert",u),u.element.innerHTML=u.highlightedCode,r&&r.call(u.element),n.hooks.run("after-highlight",u),n.hooks.run("complete",u)},c.postMessage(JSON.stringify({language:u.language,code:u.code,immediateClose:!0}))}else u.highlightedCode=n.highlight(u.code,u.grammar,u.language),n.hooks.run("before-insert",u),u.element.innerHTML=u.highlightedCode,r&&r.call(t),n.hooks.run("after-highlight",u),n.hooks.run("complete",u)},highlight:function(e,t,r){var l=n.tokenize(e,t);return a.stringify(n.util.encode(l),r)},tokenize:function(e,t){var a=n.Token,r=[e],l=t.rest;if(l){for(var i in l)t[i]=l[i];delete t.rest}e:for(var i in t)if(t.hasOwnProperty(i)&&t[i]){var o=t[i];o="Array"===n.util.type(o)?o:[o];for(var s=0;s<o.length;++s){var u=o[s],c=u.inside,g=!!u.lookbehind,h=!!u.greedy,f=0,d=u.alias;u=u.pattern||u;for(var p=0;p<r.length;p++){var m=r[p];if(r.length>e.length)break e;if(!(m instanceof a)){u.lastIndex=0;var y=u.exec(m),v=1;if(!y&&h&&p!=r.length-1){var b=r[p+1].matchedStr||r[p+1],k=m+b;if(p<r.length-2&&(k+=r[p+2].matchedStr||r[p+2]),u.lastIndex=0,y=u.exec(k),!y)continue;var w=y.index+(g?y[1].length:0);if(w>=m.length)continue;var _=y.index+y[0].length,P=m.length+b.length;if(v=3,P>=_){if(r[p+1].greedy)continue;v=2,k=k.slice(0,P)}m=k}if(y){g&&(f=y[1].length);var w=y.index+f,y=y[0].slice(f),_=w+y.length,S=m.slice(0,w),O=m.slice(_),j=[p,v];S&&j.push(S);var A=new a(i,c?n.tokenize(y,c):y,d,y,h);j.push(A),O&&j.push(O),Array.prototype.splice.apply(r,j)}}}}}return r},hooks:{all:{},add:function(e,t){var a=n.hooks.all;a[e]=a[e]||[],a[e].push(t)},run:function(e,t){var a=n.hooks.all[e];if(a&&a.length)for(var r,l=0;r=a[l++];)r(t)}}},a=n.Token=function(e,t,n,a,r){this.type=e,this.content=t,this.alias=n,this.matchedStr=a||null,this.greedy=!!r};if(a.stringify=function(e,t,r){if("string"==typeof e)return e;if("Array"===n.util.type(e))return e.map(function(n){return a.stringify(n,t,e)}).join("");var l={type:e.type,content:a.stringify(e.content,t,r),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:r};if("comment"==l.type&&(l.attributes.spellcheck="true"),e.alias){var i="Array"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(l.classes,i)}n.hooks.run("wrap",l);var o="";for(var s in l.attributes)o+=(o?" ":"")+s+'="'+(l.attributes[s]||"")+'"';return"<"+l.tag+' class="'+l.classes.join(" ")+'" '+o+">"+l.content+"</"+l.tag+">"},!_self.document)return _self.addEventListener?(_self.addEventListener("message",function(e){var t=JSON.parse(e.data),a=t.language,r=t.code,l=t.immediateClose;_self.postMessage(n.highlight(r,n.languages[a],a)),l&&_self.close()},!1),_self.Prism):_self.Prism;var r=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return r&&(n.filename=r.src,document.addEventListener&&!r.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",n.highlightAll)),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
</script>


</body>

</html>
